<?php

require_once(SERVER_ROOT . '/utils/' . 'MYSQLAdapter.php');
require_once(SERVER_ROOT . '/daos/' . 'ClienteDAO.php');
require_once(SERVER_ROOT . '/daos/' . 'UsuarioDAO.php');

class ProcessoDAO {

	private $_STATUS_ATIVO = 1;
	private $_STATUS_INATIVO = 0;
	private $_SUCESSO = 1;
	private $_ERRO = 0;
	private $_PERMISSION_ALLOW = 1;
	private $_PERMISSION_DENIED = 2;
	private $adapter;
	private $clienteDAO;
	private $usuarioDAO;
	private $tipoUsuarioDAO;

	public function __construct() {
		$this->adapter = new MYSQLAdapter($GLOBALS['config']);
		$this->clienteDAO = new ClienteDAO();
		$this->usuarioDAO = new UsuarioDAO();
		$this->tipoUsuarioDAO = new TipoUsuarioDAO();
	}

	public function save(array $params) {
		if ($params['id_usuario'] && $params['id_escritorio']) {
			$data = array(
					'id_escritorio' => $params['id_escritorio'], 'tipo_acao' => $params['tipo_acao'], 'parte_contraria' => $params['parte_contraria'], 'vara' => $params['vara'], 'num_processo' => $params['num_processo'], 'status' => $params['status'], 'advogado' => $params["advogado"], 'secretaria' => $params["secretaria"], 'estagiario' => $params["estagiario"]);
			$id_processo = $this->adapter->insert("tb_processo", $data);
			if ($id_processo) {
				$cliente = $this->clienteDAO->findByCPF($params['cpf']);
				//Todas as permissões para quem criou o processo
				$data_usuario = array('id_usuario' => $params['id_usuario'], 'id_processo' => $id_processo, 'create_processo' => $this->_PERMISSION_ALLOW, 'read_processo' => $this->_PERMISSION_ALLOW, 'update_processo' => $this->_PERMISSION_ALLOW, 'delete_processo' => $this->_PERMISSION_ALLOW);
				$this->adapter->insert("tb_processo_usuario", $data_usuario);
				return $this->_SUCESSO;
			} else {
				return $this->_ERRO;
			}
		}
		return $this->_ERRO;
	}

	// 	public function generationNumProcesso(){
	// 		$query = "SELECT MAX(num_processo) as num_processo FROM tb_processo";
	// 		$this->adapter->query($query);
	// 		$row = $this->adapter->fetch();
	// 		if($row['num_processo']){
	// 			return $row['num_processo'] + 1;
	// 		} else {
	// 			return 1;
	// 		}
	// 	}
	public function activateProcessoById($id_processo) {
		$data_update = array('status' => $this->_STATUS_ATIVO);
		$this->adapter->update("tb_processo", $data_update, "id_processo = '$id_processo'");
	}

	public function inactivateProcessoById($id_processo) {
		$data_update = array('status' => $this->_STATUS_INATIVO);
		$this->adapter->update("tb_processo", $data_update, "id_processo = '$id_processo'");
	}

	public function count() {
		$this->adapter->select("tb_processo");
		return $this->adapter->getAffectedRows();
	}
	public function countAllByEscritorio($id_escritorio) {
		$this->adapter->select("tb_processo","id_escritorio = '$id_escritorio'");
		return $this->adapter->getAffectedRows();
	}

	public function findById($id) {
		$this->adapter->select("tb_processo", "id_processo = '$id'");
		return $this->adapter->fetch();
	}

	public function findByIdCliente($id) {
		$this->adapter->select("tb_processo_cliente", "id_cliente = '$id'");
		$processos_cliente = $this->adapter->fetchAllByFilter('ProcessoCliente', array(''));
		$all = $this->find();
		$result = array();
		for ($i = 0; $i < sizeof($processos_cliente); $i++) {
			for ($j = 0; $j < sizeof($all); $j++) {
				$proc = $all[$j];
				$processo_cliente = $processos_cliente[$i];
				if ($proc['id_processo'] == $processo_cliente['id_processo']) {
					$result[$i] = $proc;
				}
			}
		}
		if ($result) {
			return $result;
		} else {
			return $this->_ERRO;
		}
	}

	public function findAllNomesClientesByIdProcesso($id_processo) {
		$this->adapter->select("tb_processo_cliente", "id_processo = '$id_processo'");
		$processos_cliente = $this->adapter->fetchAllByFilter('ProcessoCliente', array(''));
		$nome_clientes = '';
		for ($i = 0; $i < sizeof($processos_cliente); $i++) {
			$processo_cliente = $processos_cliente[$i];
			$cliente = $this->clienteDAO->findById($processo_cliente['id_cliente']);
			if ($cliente) {
				if (empty($nome_clientes)) {
					$nome_clientes = $cliente['nome'];
				} else {
					$nome_clientes = $nome_clientes . ';' . $cliente['nome'];
				}
			}
		}
		return $nome_clientes;
	}

	public function findByIdUsuario($id) {
		$this->adapter->select("tb_processo_usuario", "id_usuario = '$id'");
		$processos_usuario = $this->adapter->fetchAllByFilter('ProcessoUsuario', array(''));
		$all = $this->find();
		$result = array();
		for ($i = 0; $i < sizeof($processos_usuario); $i++) {
			for ($j = 0; $j < sizeof($all); $j++) {
				$proc = $all[$j];
				$processo_usuario = $processos_usuario[$i];
				if ($proc['id_processo'] == $processo_usuario['id_processo']) {
					$result[$i] = $proc;
				}
			}
		}
		if ($result) {
			return $result;
		} else {
			return $this->_ERRO;
		}
	}

	public function findByNumProcesso($num_processo) {
		$this->adapter->select("tb_processo", "num_processo = '$num_processo'");
		return $this->adapter->fetch();
	}

	public function removeById($id) {
		$affectedRows = $this->adapter->delete("tb_processo", "id_processo = '$id' ");
		if ($affectedRows) {
			$this->adapter->delete("tb_processo_cliente", "id_processo = '$id' ");
			$this->adapter->delete("tb_processo_usuario", "id_processo = '$id' ");
			return $this->_SUCESSO;
		} else {
			return $this->_ERRO;
		}
	}

	public function update(array $params) {
		$id = $params['id_processo'];
		$data = array(
				'tipo_acao' => $params['tipo_acao'], 'parte_contraria' => $params['parte_contraria'], 'vara' => $params['vara'], 'num_processo' => $num_processo, 'status' => $params['status'], '');
		return $this->adapter->update("tb_processo", $data, "id_processo = '$id'");
	}

	public function findAllByUsuario($id_usuario, $sidx, $sord, $start, $limit) {
		//pega os processos pelo usuario
		$this->adapter->select("tb_processo_usuario", "id_usuario = '$id_usuario'");
		$procs = $this->adapter->fetchAllByFilter('ProcessoUsuario', array(''));

		//pega o id do escritorio
		$user = $this->usuarioDAO->findById($id_usuario);
		$id_escritorio = $user['id_escritorio'];

		//Verifica o tipo de usuario e adiciona o parametro de acordo com tipo
		$tipo_usuario = $this->tipoUsuarioDAO->findById($user['id_tipo_usuario']);
		$parameter = '';
		$isGerente = '';
		if ($tipo_usuario['tipo_usuario_nome'] == 'advogado') {
			$parameter = "advogado = '1'";
		} else if ($tipo_usuario['tipo_usuario_nome'] == 'secretaria') {
			$parameter = "secretaria = '1'";
		} else if ($tipo_usuario['tipo_usuario_nome'] == 'estagiario') {
			$parameter = "estagiario = '1'";
		} else {
			$isGerente = true;
		}

		$ids = '';
		$results = array();
		if (sizeof($procs) == 1) {
			$process = $procs[0];
			$id = $process['id_processo'];
			$ids = "id_processo = $id";
		} else {
			for ($i = 0; $i < sizeof($procs); $i++) {
				if ($i != sizeof($procs) - 1) {
					$process = $procs[$i];
					$id = $process['id_processo'];
					$ids = $ids . "id_processo = $id OR ";
				} else {
					$process = $procs[$i];
					$id = $process['id_processo'];
					$ids = $ids . "id_processo = $id";
				}
			}
		}
		//                echo $ids;
		if ($ids) {
			if (!empty($parameter)) {
				$this->adapter->select("tb_processo", "$ids OR id_escritorio = '$id_escritorio' AND $parameter
						ORDER BY $sidx $sord LIMIT $start, $limit");
				$results = $this->adapter->fetchAllByFilter('Processo', array('id_escritorio' => 'id_escritorio', 'advogado' => 'advogado', 'secretaria' => 'secretaria', 'estagiario' => 'estagiario'));
			} else if ($isGerente == true) {
				$this->adapter->select("tb_processo", "$ids OR id_escritorio = '$id_escritorio'
						ORDER BY $sidx $sord LIMIT $start, $limit");
				$results = $this->adapter->fetchAllByFilter('Processo', array('id_escritorio' => 'id_escritorio', 'advogado' => 'advogado', 'secretaria' => 'secretaria', 'estagiario' => 'estagiario'));
			}
		} else {
			if (!empty($parameter)) {
				$this->adapter->select("tb_processo", "id_escritorio = '$id_escritorio' AND $parameter
						ORDER BY $sidx $sord LIMIT $start, $limit");
				$results = $this->adapter->fetchAllByFilter('Processo', array('id_escritorio' => 'id_escritorio', 'advogado' => 'advogado', 'secretaria' => 'secretaria', 'estagiario' => 'estagiario'));
			} else if ($isGerente == true) {
				$this->adapter->select("tb_processo", "id_escritorio = '$id_escritorio'
						ORDER BY $sidx $sord LIMIT $start, $limit");
				$results = $this->adapter->fetchAllByFilter('Processo', array('id_escritorio' => 'id_escritorio', 'advogado' => 'advogado', 'secretaria' => 'secretaria', 'estagiario' => 'estagiario'));
			}
		}
		return $results;
	}

	public function findAllByUsuarioWithFilters($id_usuario, $sidx, $sord, $start, $limit, $search_field, $search_string, $search_oper) {
		//pega os processos pelo usuario
		$this->adapter->select("tb_processo_usuario", "id_usuario = '$id_usuario'");
		$procs = $this->adapter->fetchAllByFilter('ProcessoUsuario', array(''));

		//pega o id do escritorio
		$user = $this->usuarioDAO->findById($id_usuario);
		$id_escritorio = $user['id_escritorio'];

		//Verifica o tipo de usuario e adiciona o parametro de acordo com tipo
		$tipo_usuario = $this->tipoUsuarioDAO->findById($user['id_tipo_usuario']);
		$parameter = '';
		$isGerente = '';
		if ($tipo_usuario['tipo_usuario_nome'] == 'advogado') {
			$parameter = "advogado = '1'";
		} else if ($tipo_usuario['tipo_usuario_nome'] == 'secretaria') {
			$parameter = "secretaria = '1'";
		} else if ($tipo_usuario['tipo_usuario_nome'] == 'estagiario') {
			$parameter = "estagiario = '1'";
		} else {
			$isGerente = true;
		}

		$ids = '';
		$results = array();
		if (sizeof($procs) == 1) {
			$process = $procs[0];
			$id = $process['id_processo'];
			$ids = "id_processo = $id";
		} else {
			for ($i = 0; $i < sizeof($procs); $i++) {
				if ($i != sizeof($procs) - 1) {
					$process = $procs[$i];
					$id = $process['id_processo'];
					$ids = $ids . "id_processo = $id OR ";
				} else {
					$process = $procs[$i];
					$id = $process['id_processo'];
					$ids = $ids . "id_processo = $id";
				}
			}
		}
		//                echo $ids;
		if ($ids) {
			if (!empty($parameter)) {
				if ($search_oper == 'eq') {
					$this->adapter->select("tb_processo", "$search_field = '$search_string' AND $ids OR id_escritorio = '$id_escritorio' AND $parameter AND $search_field = '$search_string'
							ORDER BY $sidx $sord LIMIT $start, $limit");
					$results = $this->adapter->fetchAllByFilter('Processo', array('id_escritorio' => 'id_escritorio', 'advogado' => 'advogado', 'secretaria' => 'secretaria', 'estagiario' => 'estagiario'));
				} else {
					$this->adapter->select("tb_processo", "$search_field like '%$search_string%' AND $ids OR id_escritorio = '$id_escritorio' AND $parameter AND $search_field like '%$search_string%'
							ORDER BY $sidx $sord LIMIT $start, $limit");
					$results = $this->adapter->fetchAllByFilter('Processo', array('id_escritorio' => 'id_escritorio', 'advogado' => 'advogado', 'secretaria' => 'secretaria', 'estagiario' => 'estagiario'));
				}
			} else if ($isGerente == true) {
				if ($search_oper == 'eq') {
					$this->adapter->select("tb_processo", "$search_field = '$search_string' AND $ids OR id_escritorio = '$id_escritorio' AND $search_field = '$search_string'
							ORDER BY $sidx $sord LIMIT $start, $limit");
					$results = $this->adapter->fetchAllByFilter('Processo', array('id_escritorio' => 'id_escritorio', 'advogado' => 'advogado', 'secretaria' => 'secretaria', 'estagiario' => 'estagiario'));
				} else {
					$this->adapter->select("tb_processo", "$search_field like '%$search_string%' AND $ids OR id_escritorio = '$id_escritorio' AND $search_field like '%$search_string%'
							ORDER BY $sidx $sord LIMIT $start, $limit");
					$results = $this->adapter->fetchAllByFilter('Processo', array('id_escritorio' => 'id_escritorio', 'advogado' => 'advogado', 'secretaria' => 'secretaria', 'estagiario' => 'estagiario'));
				}
			}
		} else {
			if (!empty($parameter)) {
				if ($search_oper == 'eq') {
					$this->adapter->select("tb_processo", "id_escritorio = '$id_escritorio' AND $parameter AND $search_field = '$search_string'
							ORDER BY $sidx $sord LIMIT $start, $limit");
					$results = $this->adapter->fetchAllByFilter('Processo', array('id_escritorio' => 'id_escritorio', 'advogado' => 'advogado', 'secretaria' => 'secretaria', 'estagiario' => 'estagiario'));
				} else {
					$this->adapter->select("tb_processo", "id_escritorio = '$id_escritorio' AND $parameter AND $search_field like '%$search_string%'
							ORDER BY $sidx $sord LIMIT $start, $limit");
					$results = $this->adapter->fetchAllByFilter('Processo', array('id_escritorio' => 'id_escritorio', 'advogado' => 'advogado', 'secretaria' => 'secretaria', 'estagiario' => 'estagiario'));
				}
			} else if ($isGerente == true) {
				if ($search_oper == 'eq') {
					$this->adapter->select("tb_processo", "id_escritorio = '$id_escritorio' AND $search_field = '$search_string'
							ORDER BY $sidx $sord LIMIT $start, $limit");
					$results = $this->adapter->fetchAllByFilter('Processo', array('id_escritorio' => 'id_escritorio', 'advogado' => 'advogado', 'secretaria' => 'secretaria', 'estagiario' => 'estagiario'));
				} else {
					$this->adapter->select("tb_processo", "id_escritorio = '$id_escritorio' AND $search_field like '%$search_string%'
							ORDER BY $sidx $sord LIMIT $start, $limit");
					$results = $this->adapter->fetchAllByFilter('Processo', array('id_escritorio' => 'id_escritorio', 'advogado' => 'advogado', 'secretaria' => 'secretaria', 'estagiario' => 'estagiario'));
				}
			}
		}
		return $results;
	}

	public function findAll($sidx, $sord, $start, $limit) {
		$this->adapter->select("tb_processo", "1=1
				ORDER BY $sidx $sord LIMIT $start, $limit");
		return $this->adapter->fetchAllByFilter('Processo', array('id_escritorio' => 'id_escritorio', 'advogado' => 'advogado', 'secretaria' => 'secretaria', 'estagiario' => 'estagiario'));
	}

	public function findAllWithFilters($sidx, $sord, $start, $limit, $search_field, $search_string, $search_oper) {
		if ($search_oper == 'eq') {
			$this->adapter->select("tb_processo", "$search_field = '$search_string'
					ORDER BY $sidx $sord LIMIT $start, $limit");
			return $this->adapter->fetchAllByFilter('Processo', array('id_escritorio' => 'id_escritorio', 'advogado' => 'advogado', 'secretaria' => 'secretaria', 'estagiario' => 'estagiario'));
		} else {
			$this->adapter->select("tb_processo", "$search_field like '%$search_string%'
					ORDER BY $sidx $sord LIMIT $start, $limit");
			return $this->adapter->fetchAllByFilter('Processo', array('id_escritorio' => 'id_escritorio', 'advogado' => 'advogado', 'secretaria' => 'secretaria', 'estagiario' => 'estagiario'));
		}
	}

	public function find() {
		$this->adapter->select("tb_processo");
		return $this->adapter->fetchAllByFilter('Processo', array('id_escritorio' => 'id_escritorio', 'advogado' => 'advogado', 'secretaria' => 'secretaria', 'estagiario' => 'estagiario'));
	}

}